package com.hikw.controller;

import com.hikw.clients.ProviderClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * @Description: 服务消费者控制
 * @ClassNmae: ConsumerController
 * @Author: hy
 * @DateTime: 2021-07-26 14:40
 **/
@RestController
@Slf4j
public class ConsumerController {

    @Autowired
    //RestTemplate不能自动装载  需要手动配置Bean
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private ProviderClient providerClient;

    //获取providers服务的服务列表
    @GetMapping("/consumer/getServiceInstance")
    public List<ServiceInstance> geterviceInstance() {
        return this.discoveryClient.getInstances("providers");
    }

    /*
    服务调用
    方法1：通过RestTemplate直接调用(不常用)
    缺点：1.uri固定写死  2.不能实现负载均衡  3.后期维护困难
     */
//    @GetMapping("/consumer/serviceInvoking")
//    public String serviceInvoking() {
//        String result = restTemplate.getForObject("http://127.0.0.1:8888/provider/getPort", String.class);
//        log.info("调用成功，端口为：{}", result);
//        return "调用成功，端口为：" + result;
//    }

    /*
    服务调用
    方法2：通过DiscoveryClient+RestTemplate调用(不常用)
    缺点：1.代码冗余量大  2.后期维护困难
    */
//    @GetMapping("/consumer/serviceInvoking")
//    public String serviceInvoking() {
//        //获取服务列表
//        List<ServiceInstance> serviceInstanceList = this.discoveryClient.getInstances("providers");
//        //手动实现负载均衡
//        int num = ThreadLocalRandom.current().nextInt(serviceInstanceList.size());
//        //获取实例
//        ServiceInstance serviceInstance = serviceInstanceList.get(num);
//        //通过RestTemplate调用
//        String result = restTemplate.getForObject(serviceInstance.getUri() + "/provider/getPort", String.class);
//        log.info("调用成功，端口为：{}", result);
//        return "调用成功，端口为：" + result;
//    }

    /*
    服务调用
    方法3：通过Ribbon+RestTemplate调用(不常用)
    使用：在RestTemplate Bean上添加@LoadBalanced注解实现自动负载均衡
    缺点：1.后期维护困难
    */
//    @GetMapping("/consumer/serviceInvoking")
//    public String serviceInvoking() {
//        // http://服务ID/服务地址
//        String result = restTemplate.getForObject("http://providers/provider/getPort", String.class);
//        log.info("调用成功，端口为：{}", result);
//        return "调用成功，端口为：" + result;
//    }

    /*
    服务调用
    方法4：通过OpenFeign调用(推荐)
    */
    @GetMapping("/consumer/serviceInvoking")
    public String serviceInvoking() {
        String result = providerClient.getPort();
        log.info("调用成功，端口为：{}", result);
        return "调用成功，端口为：" + result;
    }


}
